home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr08 / ngw13.zip / VIEWNG.PRG < prev    next >
Text File  |  1995-01-15  |  13KB  |  458 lines

  1. #include "ViewNg.ch"
  2. #include "FiveWin.ch"
  3.  
  4. //
  5. #define  ID_VIEWNG      "ViewNg 1.3"
  6. //
  7. Static   oWnd
  8. Static   oNgFile
  9. Static   oNgEntry
  10. Static   nStart
  11. Static   oClp
  12. // Indicate that we're searching
  13. Static   lActive  := .F.
  14. Static   cString
  15. Static   nFound   := 0
  16. //
  17.  
  18. Function Main( cFile )
  19.    LOCAL oMenu
  20.    LOCAL oIcon
  21.    LOCAL oBrush
  22.    LOCAL oDlg
  23.    LOCAL oFont
  24.    //
  25.    LOCAL cTitle
  26.    LOCAL cChoose
  27.    LOCAL cError
  28.    LOCAL cNotNg
  29.    LOCAL cLangage
  30.    LOCAL cConfirm
  31.    LOCAL cQuit
  32.    LOCAL cLoading
  33.    LOCAL cWait
  34.    LOCAL nLen
  35.    //
  36.    cString := SPACE( 40 )
  37.    SET 3DLOOK     ON
  38.    // Are we in French ?
  39.    cLangage := GetProfStr("intl", "sLanguage")
  40.    IF ( Upper( cLangage ) == "FRA" )
  41.       nStart := ID_FRENCH  // Starting Number of French Resource
  42.    ELSE
  43.       nStart := ID_OTHER   // Starting Number of English Resource
  44.    ENDIF
  45.    //
  46.    REDEFINE cError    AS CHARACTER RESOURCE nStart+IDS_ERROR
  47.    REDEFINE cNotNg    AS CHARACTER RESOURCE nStart+IDS_NOTNG
  48.    REDEFINE cChoose   AS CHARACTER RESOURCE nStart+IDS_CHOOSE
  49.    REDEFINE cConfirm  AS CHARACTER RESOURCE nStart+IDS_CONFIRM
  50.    REDEFINE cQuit     AS CHARACTER RESOURCE nStart+IDS_QUIT
  51.    REDEFINE cLoading AS CHARACTER RESOURCE nStart+IDS_LOADING
  52.    REDEFINE cWait    AS CHARACTER RESOURCE nStart+IDS_WAIT
  53.    //
  54.    IF EMPTY( cFile )
  55.       cFile :=  cGetFile( "Norton Guide | *.NG", cChoose )
  56.       IF EMPTY( cFile )
  57.          RETURN .F.
  58.       ENDIF
  59.    ENDIF
  60.    // Create the Main Object for our purpose
  61.    oNgFile := NgFile():New( cFile, .T. )
  62.    IF ( oNgFile:cTitle == Nil )
  63.       MsgAlert( cFile + CRLF + cNotNg, cError )
  64.       RETURN .F.
  65.    ENDIF
  66.    // Everything ok..
  67.    // Please Wait, opening File....
  68.    DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  69.    nLen := MAX( Len( cLoading ), Len( cWait ) ) + 2
  70.    DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  71.    DEFINE DIALOG oDlg FROM 0,0 TO 5,nLen FONT oFont
  72.    @ 0.2,0.5 SAY cLoading  OF oDlg
  73.    @ 1  ,0.5 SAY cWait     OF oDlg
  74.    ACTIVATE DIALOG oDlg CENTERED NOWAIT
  75.    SysRefresh()
  76.    //
  77.    CursorWait()
  78.    oNgFile:Open()
  79.    //
  80.    oMenu := BuildMenu( oNgFile )
  81.    //
  82.    CursorArrow()
  83.    oDlg:End()
  84.    RELEASE FONT oFont
  85.    //
  86.    cTitle := Lower( cFileName( cFile ) )
  87.    cTitle := Upper( Left( cTitle, 1 ) ) + SubStr( cTitle, 2 )
  88.    //
  89.    DEFINE BRUSH oBrush STYLE BRICKS
  90.    DEFINE ICON  oICon  RESOURCE "ViewNg"
  91.    DEFINE WINDOW oWnd FROM 1,1 TO 20,20 ;
  92.       MENU  oMenu                       ;
  93.       ICON  oIcon                       ;
  94.       BRUSH oBrush                      ;
  95.       TITLE ID_VIEWNG + " - [" + cTitle + "]"
  96.    SET MESSAGE OF oWnd TO oNgFile:cTitle
  97.    DEFINE CLIPBOARD oClp OF oWnd
  98.    ACTIVATE WINDOW oWnd MAXIMIZED       ;
  99.       VALID MsgYesNo( cConfirm + CRLF + ID_VIEWNG, cQuit )
  100.    //
  101.    oNgFile:Close()
  102. RETURN .T.
  103.  
  104.  
  105. // Building the menu from the one in the NG File
  106. FUNCTION BuildMenu( oNg )
  107.    LOCAL oMenu
  108.    LOCAL cBlock
  109.    LOCAL bBlock
  110.    LOCAL nTop, nSub
  111.    //
  112.    LOCAL cOpen
  113.    LOCAL cTitle
  114.    LOCAL cCredit
  115.    LOCAL cQuit
  116.    //
  117.    REDEFINE cOpen     AS CHARACTER RESOURCE nStart+IDS_OPEN
  118.    REDEFINE cTitle    AS CHARACTER RESOURCE nStart+IDS_TITLE
  119.    REDEFINE cCredit   AS CHARACTER RESOURCE nStart+IDS_CREDIT
  120.    REDEFINE cQuit     AS CHARACTER RESOURCE nStart+IDS_QUIT
  121.    //
  122.    MENU oMenu
  123.       // The Info Menu..
  124.       MENUITEM "?"
  125.          MENU
  126.             //
  127.             MENUITEM cOpen          ;
  128.                ACTION NewFile( )
  129.             SEPARATOR
  130.             MENUITEM cTitle         ;
  131.                ACTION MsgInfo( oNg:cTitle, cTitle )
  132.             MENUITEM cCredit        ;
  133.                ACTION About( cCredit )
  134.             SEPARATOR
  135.             MENUITEM cQuit          ;
  136.                ACTION oWnd:End()
  137.          ENDMENU
  138.       // For each Top Menu
  139.       FOR nTop := 1 TO LEN( oNg:aMenus )
  140.          MENUITEM oNg:aMenus[ nTop, 1 ]
  141.             MENU
  142.                // For each Sub Menu
  143.                FOR nSub := 1 TO LEN( oNg:aMenus[ nTop, 2 ] )
  144.                   // Let's get a block for this menu
  145.                   // who's calling HandleMenu with :
  146.                   //    N° Top Menu
  147.                   //    N° Sub Menu
  148.                   //    Text of Menu
  149.                   cBlock := '{ || HandleMenu('     +             ;
  150.                            ALLTRIM( STR( nTop ) )  + ',' +       ;
  151.                            ALLTRIM( STR( nSub ) )  + ',' + '"' + ;
  152.                            StrTran( oNg:aMenus[ nTop, 1 ],'"',' ' )   + ;
  153.                            '"+" > "+"' + ;
  154.                            StrTran( oNg:aMenus[ nTop, 2, nSub ],'"', ' ' ) + ;
  155.                            '") }'
  156.                   bBlock := &( cBlock )
  157.                   MENUITEM oNg:aMenus[ nTop, 2, nSub ]  ;
  158.                      BLOCK bBlock
  159.                NEXT
  160.             ENDMENU
  161.       NEXT
  162.    ENDMENU
  163. RETURN ( oMenu )
  164.  
  165.  
  166. //
  167. PROCEDURE About( cAbout )
  168.    LOCAL cCredit := ""
  169.    LOCAL nCpt
  170.    FOR nCpt := 1 TO LEN( oNgFile:aCredit )
  171.       cCredit := cCredit + oNgFile:aCredit[ nCpt ] + CRLF
  172.    NEXT
  173.    MsgInfo( cCredit, cAbout )
  174. RETURN
  175.  
  176.  
  177. // Handle all the menu events
  178. PROCEDURE HandleMenu( nTop, nSub, cMenu )
  179.    LOCAL oDlg
  180.    LOCAL oFont
  181.    LOCAL cLoading
  182.    LOCAL cWait
  183.    LOCAL nLen
  184.    LOCAL nOffset
  185.    LOCAL nPos
  186.    LOCAL aBack
  187.    //
  188.    oNgEntry := Nil
  189.    //
  190.    REDEFINE cLoading AS CHARACTER RESOURCE nStart+IDS_LOADING
  191.    REDEFINE cWait    AS CHARACTER RESOURCE nStart+IDS_WAIT
  192.    nLen := MAX( Len( cLoading ), Len( cWait ) ) + 2
  193.    // Please Wait
  194.    WHILE .T.
  195.       DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  196.       DEFINE DIALOG oDlg FROM 0,0 TO 5,nLen ;
  197.          FONT oFont
  198.       @ 0.2,0.5 SAY cLoading  OF oDlg
  199.       @ 1  ,0.5 SAY cWait     OF oDlg
  200.       ACTIVATE DIALOG oDlg CENTERED NOWAIT
  201.       // Resfresh so we see the text...
  202.       SysRefresh()
  203.       //
  204.       CursorWait()
  205.       // Read the Entry
  206.       IF ( oNgEntry == Nil )
  207.          oNgEntry := oNgFile:GetEntry( nTop, nSub )
  208.       ELSE
  209.          oNgEntry:Read( nOffset )
  210.       ENDIF
  211.       //
  212.       oDlg:End()
  213.       RELEASE FONT oFont
  214.       // Resfresh to wait that the dialog end.
  215.       SysRefresh()
  216.       CursorArrow()
  217.       //
  218.       IF oNgEntry:lShort
  219.          aBack := ShowShort( nPos, cMenu )
  220.       ELSE
  221.          aBack := ShowLong( nPos, cMenu )
  222.       ENDIF
  223.       IF ( aBack[ 1 ] == -1 )
  224.          Exit
  225.       ENDIF
  226.       nOffset := aBack[ 1 ]
  227.       nPos    := aBack[ 2 ]
  228.    ENDDO
  229. RETURN
  230.  
  231. // Show a short entry
  232. FUNCTION ShowShort( nPos, cMenu )
  233.    LOCAL oDlg
  234.    LOCAL nOffset
  235.    LOCAL oLbx
  236.    LOCAL oFont
  237.    LOCAL nShort := Nil
  238.    DEFAULT nPos := 1
  239.    //
  240.    DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  241.    DEFINE DIALOG oDlg FROM 0,0 TO 24,79   ;
  242.       TITLE cMenu
  243.    @ 4,1 LISTBOX oLbx                     ;
  244.          VAR nPos                         ;
  245.          SIZE 311,175                     ;
  246.          ITEMS   oNgEntry:aContainer      ;
  247.          ON DBLCLICK IIF( oNgEntry:aOffset[oLbx:GetPos()]<>-1, oDlg:End(1), ) ;
  248.          FONT oFont                       ;
  249.          PIXEL                            ;
  250.          OF oDlg
  251.    //
  252.    //SET KEY VK_SPACE TO Search( oLbx )
  253.    SetKey( VK_SPACE, { || Search( oLbx ) } )
  254.    //
  255.    ACTIVATE DIALOG oDlg CENTERED
  256.    RELEASE FONT oFont
  257.    //
  258.    SET KEY VK_SPACE TO
  259.    //
  260.    IF ( oDlg:nResult == 1 )
  261.       // Go to next entry
  262.       nOffset := oNgEntry:aOffset[ nPos ]
  263.    ELSE
  264.       // Come Back
  265.       nOffset := oNgEntry:nFrom
  266.       nShort  := oNgEntry:nShort
  267.    ENDIF
  268.    //
  269. RETURN { nOffset, nShort }
  270.  
  271. // Search in a Short List
  272. Function Search( oLbx )
  273.    LOCAL oDlg
  274.    LOCAL cSearch
  275.    LOCAL cOk
  276.    LOCAL cCancel
  277.    LOCAL cTemp
  278.    // When can activate one search at a time....
  279.    IF !lActive
  280.       lActive := .T.
  281.       //
  282.       REDEFINE cSearch  AS CHARACTER RESOURCE nStart+IDS_SEARCH
  283.       REDEFINE cOk      AS CHARACTER RESOURCE nStart+IDS_OK
  284.       REDEFINE cCancel  AS CHARACTER RESOURCE nStart+IDS_CANCEL
  285.       cTemp := cString
  286.       //
  287.       DEFINE DIALOG oDlg            ;
  288.          FROM 01,01 TO 07,25        ;
  289.          TITLE cSearch
  290.       @ 0.5,01 GET cString          ;
  291.          PICTURE "@S20"             ;
  292.          OF oDlg
  293.       @ 02,0.5 BUTTON cOk           ;
  294.          SIZE 40,BUTTON_SIZE        ;
  295.          ACTION oDlg:End()          ;
  296.          OF oDlg
  297.       @ 02,07 BUTTON cCancel        ;
  298.          SIZE 40,BUTTON_SIZE        ;
  299.          ACTION ( cString := "", oDlg:End() ) ;
  300.          OF oDlg
  301.       ACTIVATE DIALOG oDlg CENTERED
  302.       //
  303.       IF !EMPTY( cString )
  304.          IF !( Upper( AllTrim( cTemp ) ) == Upper( AllTrim( cString ) ) )
  305.             nFound := 1
  306.          ENDIF
  307.          nFound := ASCAN( oLbx:aItems,                         ;
  308.             { |x| Upper( AllTrim( cString ) ) $ Upper( x ) },  ;
  309.             nFound + 1 )
  310.          IF !( nFound == 0 )
  311.             oLbx:Select( nFound )
  312.             oLbx:Refresh()
  313.          ENDIF
  314.       ENDIF
  315.       //
  316.       lActive := .F.
  317.    ENDIF
  318. Return Nil
  319.  
  320.  
  321.  
  322. // Show a Long Entry
  323. FUNCTION ShowLong( nPos, cMenu )
  324.    LOCAL oDlg
  325.    LOCAL oMGet
  326.    LOCAL oFont
  327.    LOCAL aRetVal
  328.    LOCAL lButton
  329.    LOCAL lNext
  330.    LOCAL lPrev
  331.    LOCAL lSee
  332.    LOCAL cNext
  333.    LOCAL cPrev
  334.    LOCAL cCopy
  335.    LOCAL nSee
  336.    LOCAL cSeeStr := ""
  337.    DEFAULT nPos := 1
  338.    //
  339.    REDEFINE cNext AS CHARACTER RESOURCE nStart+IDS_NEXT
  340.    REDEFINE cPrev AS CHARACTER RESOURCE nStart+IDS_PREV
  341.    REDEFINE cCopy AS CHARACTER RESOURCE nStart+IDS_COPY
  342.    //
  343.    DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  344.    DEFINE DIALOG oDlg FROM 0,0 TO 24,79 ;
  345.       TITLE cMenu
  346.    lPrev := ( oNgEntry:nPrev <> -1 )
  347.    lNext := ( oNgEntry:nNext <> -1 )
  348.    lSee  := !Empty( oNgEntry:aSeeAlso )
  349.    @ 01,000 BUTTON cPrev               ;
  350.       SIZE 40,BUTTON_SIZE              ;
  351.       ACTION   oDlg:End( 5 )           ;
  352.       OF       oDlg                    ;
  353.       PIXEL                            ;
  354.       WHEN     lPrev
  355.    @ 01,050 BUTTON cNext               ;
  356.       SIZE 40,BUTTON_SIZE              ;
  357.       ACTION   oDlg:End( 6 )           ;
  358.       OF       oDlg                    ;
  359.       PIXEL                            ;
  360.       WHEN     lNext
  361.    @ 01,100 COMBOBOX cSeeStr           ;
  362.       SIZE  090,Nil                    ;
  363.       ITEMS oNgEntry:aSeeAlso          ;
  364.       ON CHANGE oDlg:End( 7 )          ;
  365.       OF oDlg                          ;
  366.       PIXEL                            ;
  367.       WHEN     lSee
  368.    @ 01,200 BUTTON cCopy SIZE 40,BUTTON_SIZE ;
  369.       ACTION  oClp:SetText( oMGet:GetSel() ) ;
  370.       PIXEL                            ;
  371.       OF oDlg
  372.    @ 16,01 GET oMGet                   ;
  373.       VAR oNgEntry:aContainer          ;
  374.       MULTILINE                        ;
  375.       READONLY                         ;
  376.       SIZE 311,164                     ;
  377.       FONT oFont                       ;
  378.       PIXEL                            ;
  379.       OF oDlg
  380.    // We set focus on the text, so we can Copy some parts to the ClipBoard
  381.    // on first attempt.
  382. //   oMGet:SetFocus()
  383.    ACTIVATE DIALOG oDlg CENTERED       ;
  384.       ON PAINT oMGet:SetFocus()
  385.    RELEASE FONT oFont
  386.    //
  387.    DO CASE
  388.       // Previous
  389.       CASE oDlg:nResult == 5
  390.          aRetVal := { oNgEntry:nPrev, Nil }
  391.       // Next
  392.       CASE oDlg:nResult == 6
  393.          aRetVal := { oNgEntry:nNext, Nil }
  394.       // See Also
  395.       CASE oDlg:nResult == 7
  396.          nSee := ASCAN( oNgEntry:aSeeAlso, cSeeStr )
  397.          aRetVal := { oNgEntry:aSeeOff[ nSee ], 1 }
  398.       OTHERWISE
  399.          aRetVal := { oNgEntry:nFrom, oNgEntry:nShort }
  400.    ENDCASE
  401.    //
  402. RETURN aRetVal
  403.  
  404. // Open a New NG File
  405. PROCEDURE NewFile( )
  406.    LOCAL cError, cNotNg, cChoose
  407.    LOCAL cLoading, cWait, oDlg, oMenu, cTitle, oFont, nLen
  408.    LOCAL cNewFile, oNewNg
  409.    //
  410.    REDEFINE cError    AS CHARACTER RESOURCE nStart+IDS_ERROR
  411.    REDEFINE cNotNg    AS CHARACTER RESOURCE nStart+IDS_NOTNG
  412.    REDEFINE cChoose   AS CHARACTER RESOURCE nStart+IDS_CHOOSE
  413.    REDEFINE cLoading AS CHARACTER RESOURCE nStart+IDS_LOADING
  414.    REDEFINE cWait    AS CHARACTER RESOURCE nStart+IDS_WAIT
  415.    //
  416.    cNewFile :=  cGetFile( "Norton Guide | *.NG", cChoose )
  417.    IF EMPTY( cNewFile )
  418.       RETURN
  419.    ENDIF
  420.    // Create the Main Object for our purpose
  421.    oNewNg := NgFile():New( cNewFile, .T. )
  422.    IF ( oNewNg:cTitle == Nil )
  423.       MsgAlert( cNewFile + CRLF + cNotNg, cError )
  424.       RETURN
  425.    ENDIF
  426.    // Everything ok..
  427.    // Please Wait, opening File....
  428.    DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  429.    nLen := MAX( Len( cLoading ), Len( cWait ) ) + 2
  430.    DEFINE FONT oFont NAME "FixedSys" SIZE 0,-8
  431.    DEFINE DIALOG oDlg FROM 0,0 TO 5,nLen FONT oFont
  432.    @ 0.2,0.5 SAY cLoading  OF oDlg
  433.    @ 1  ,0.5 SAY cWait     OF oDlg
  434.    ACTIVATE DIALOG oDlg CENTERED NOWAIT
  435.    SysRefresh()
  436.    //
  437.    CursorWait()
  438.    oNewNg:Open()
  439.    //
  440.    oMenu := BuildMenu( oNewNg )
  441.    //
  442.    CursorArrow()
  443.    oDlg:End()
  444.    RELEASE FONT oFont
  445.    //
  446.    cTitle := Lower( cFileName( cNewFile ) )
  447.    cTitle := Upper( Left( cTitle, 1 ) ) + SubStr( cTitle, 2 )
  448.    //
  449.    oNgFile:Close()
  450.    //
  451.    oWnd:cTitle( ID_VIEWNG + " - [" + cTitle + "]" )
  452.    oWnd:SetMenu( oMenu )
  453.    oNgFile  := oNewNg
  454.    SET MESSAGE OF oWnd TO oNgFile:cTitle
  455.    oNgEntry := Nil
  456.    //
  457. RETURN
  458.